package com.mxl.datebase.orm;

import java.util.List;

import com.ibatis.sqlmap.client.event.RowHandler;
import com.mxl.datebase.orm.pagination.Page;

/**
 * 对于复杂的查询，如多表（三个或三个以上）关联查询，需要极高的性能优化，建议采用ibatis的方式直接编写sql来查询.
 * 
 * @author 
 */
public interface QueryDao {

	/**
	 * 查询单一的对象
	 * 
	 * @param statementName ibatis mapper文件中的select Id
	 * @param parameterObject 参数对象
	 * @return
	 */
	public <X> X queryForObject(String statementName, Object parameterObject);
	
	/**
	 * 查询结果为集合对象
	 * 
	 * @param statementName ibatis mapper文件中的select statement ID
	 * @param parameterObject 参数对象
	 * @return
	 */
	public <X> List<X> queryForList(String statementName, Object parameterObject);
	
	/**
	 * 分页查询，利用数据库特性进行物理分页.
	 * <li>Oracle分页查询结构如下(其中rownum从1开始):</li>
	 * <pre>
	 * &lt;select id="searchUser" parameterClass="map" resultType="User"&gt;
	 * 	SELECT * FROM ( SELECT row_.*, rownum rownum_ FROM (
	 * 		SELECT id, name, login_name as loginName, email
	 * 		FROM acct_user
	 * 	) row_ WHERE rownum <= #endRow#) WHERE rownum_ >= #startRow#
	 * &lt;/select&gt;
	 * </pre>
	 * <li>MySql分页查询结构如下（其中offset从0开始）:</li>
	 * <pre>
	 * &lt;select id="searchUser" parameterClass="map" resultType="User"&gt;
	 *	select id, name, login_name as loginName, email
	 *	from acct_user
	 *	limit (#{endRow} -1) offset (#{startRow} - 1)
	 * &lt;/select&gt;
	 * </pre>
	 * <li>为计算数据库中查询记录总数，需提供下面一条sql，注意id的命名规则（@count）</li>
	 * <pre>
	 * &lt;select id="searchUser@count" parameterClass="map" resultType="User"&gt;
	 *	select count(*)	from acct_user
	 * &lt;/select&gt;
	 * </pre>
	 * @param statementName mybatis mapper文件中的select Id
	 * @param page 分页参数对象，查询结束后，在此对象中自动返回数据库中记录总数
	 * @param parameterObject 参数对象，可以是Pojo，或者是Map，Pojo将被转换成键值对的Map形式
	 * @return
	 */
	public <X> List<X> queryForList(String statementName, Page page, Object parameterObject);
	
	/**
	 * 查询出的结果交由ResultHandler处理
	 * 
	 * @param statementName ibatis mapper文件中的select statement ID
	 * @param parameterObject
	 * @param resultHandler 
	 */
	public void queryWithResultHandler(String statementName, Object parameterObject, RowHandler rowHandler);
	
}
